const cloud = require('wx-server-sdk');
const PizZip = require('pizzip');
const Docxtemplater = require('docxtemplater');
const fs = require('fs').promises; // 使用promises API进行异步操作

// 初始化云开发
cloud.init({
    env: cloud.DYNAMIC_CURRENT_ENV
});

// 配置项
const CONFIG = {
    OUTPUT_DIR: 'generated_resumes', // 输出目录
    LOG_PREFIX: '[ResumeGenerator]' // 日志前缀
};

/**
 * 云函数入口函数 - 使用docx-templates生成简历
 * @param {object} event - 云函数调用参数 { complexData, templateUrl }
 * @param {object} context - 云函数调用上下文
 */
exports.main = async (event, context) => {
    try {
        // 参数校验
        if (!event || !event.complexData || !event.templateUrl) {
            console.error(`${CONFIG.LOG_PREFIX} 缺少必要参数: complexData 或 templateUrl`);
            return {
                success: false,
                error: '缺少必要参数: complexData 或 templateUrl'
            };
        }

        const { complexData, templateUrl } = event;
        const startTime = Date.now(); // 记录开始时间

        // 1. 获取当前日期用于目录结构
        const now = new Date();
        const dateDir = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;

        // 2. 从云存储下载模板文件
        console.log(`${CONFIG.LOG_PREFIX} 开始下载模板文件: ${templateUrl}`);
        const { fileContent } = await cloud.downloadFile({
            fileID: templateUrl
        });
        // 检查模板文件是否存在
        if (!fileContent) {
            console.error(`${CONFIG.LOG_PREFIX} 模板文件不存在: ${templateUrl}`);
            return {
                success: false,
                error: '模板文件不存在'
            };
        }

        console.log(`${CONFIG.LOG_PREFIX} 正在处理模板文件: ${templateUrl}`);

        try {
            // 直接使用下载的Buffer内容
            const zip = new PizZip(fileContent);

            // 使用新的构造函数方式，直接传入 zip 和选项
            const doc = new Docxtemplater(zip, {
                paragraphLoop: true,
                linebreaks: true
            });

            // 渲染数据
            doc.render(complexData);

            // 将文档转换为nodejs能使用的buffer
            const buf = doc.getZip().generate({ type: 'nodebuffer' });

            // 4. 上传生成的文件到云存储
            const cloudPath = `${CONFIG.OUTPUT_DIR}/${dateDir}/${Date.now()}.docx`;
            console.log(`${CONFIG.LOG_PREFIX} 正在上传生成的文件到: ${cloudPath}`);

            const { fileID } = await cloud.uploadFile({
                cloudPath,
                fileContent: buf
            });

            const elapsedTime = Date.now() - startTime;
            console.log(`${CONFIG.LOG_PREFIX} 简历生成成功, 耗时: ${elapsedTime}ms, 文件ID: ${fileID}`);

            return {
                success: true,
                fileID,
                cloudPath,
                elapsedTime
            };
        } catch (error) {
            console.error(`${CONFIG.LOG_PREFIX} 生成简历失败:`, error);

            // 分类错误信息
            let errorMsg = '生成简历失败';
            if (error instanceof Docxtemplater.TemplateError) {
                errorMsg = '模板格式错误: ' + error.message;
            } else if (error instanceof Docxtemplater.RenderError) {
                errorMsg = '数据渲染错误: ' + error.message;
            } else if (error instanceof PizZip.Error) {
                errorMsg = '模板文件损坏: ' + error.message;
            }

            return {
                success: false,
                error: errorMsg,
                errorType: error.name,
                elapsedTime: Date.now() - startTime
            };
        }
    } catch (error) {
    }

};